package model

import (
	"database/sql/driver"
	"encoding/json"
	"errors"
)

// K8sDeployConfig 适配GORM的K8s部署配置结构体
type K8sDeployConfig struct {
	// 数据库基础字段（GORM自动填充）
	ID int64 `gorm:"primaryKey;autoIncrement" json:"id"` // 主键自增

	HostName        JSONSlice `gorm:"type:json" json:"hostname"`        // Mstart name
	Node_Hostname   JSONSlice `gorm:"type:json" json:"node_hostname"`   // Node name
	Deploy_Hostname JSONSlice `gorm:"type:json" json:"deploy_hostname"` // deploy name

	//CreatedAt time.Time      `gorm:"autoCreateTime" json:"created_at"`    // 创建时间（自动填充）
	//UpdatedAt time.Time      `gorm:"autoUpdateTime" json:"updated_at"`    // 更新时间（自动填充）

	// 核心必传字段（Gin绑定验证）
	K8sName    string `json:"k8s_name" binding:"required"`   // 集群名称（唯一）
	OsVersion  string `json:"osVersion" binding:"required"`  // 操作系统版本（如debian）
	K8sVersion string `json:"k8sVersion" binding:"required"` // K8s版本（如1.19.16）

	// Master节点专属字段（切片需指定gorm:type:json，空切片自动存为[]）
	ClusterServerIds         JSONSlice `gorm:"type:json" json:"clusterServerIds"`
	ClusterMasterIps         JSONSlice `gorm:"type:json" json:"clusterMasterIps"`
	ClusterMasterNics        JSONSlice `gorm:"type:json" json:"clusterMasterNics"`
	ClusterMasterCredentials JSONSlice `gorm:"type:json" json:"clusterMasterCredentials"`

	//Node节点专属字段
	ClusterNodeServerIds   JSONSlice `gorm:"type:json" json:"clusterNodeServerIds"`
	ClusterNodeIps         JSONSlice `gorm:"type:json" json:"clusterNodeIps"`
	ClusterNodeNics        JSONSlice `gorm:"type:json" json:"clusterNodeNics"`
	ClusterNodeCredentials JSONSlice `gorm:"type:json" json:"clusterNodeCredentials"`

	//部署机节点专属字段
	ClusterDeployServerIds   JSONSlice `gorm:"type:json" json:"clusterDeployServerIds"`
	ClusterDeployIps         JSONSlice `gorm:"type:json" json:"clusterDeployIps"`
	ClusterDeployNics        JSONSlice `gorm:"type:json" json:"clusterDeployNics"`
	ClusterDeployCredentials JSONSlice `gorm:"type:json" json:"clusterDeployCredentials"`

	// HA高可用字段（集群模式可能有值，单机模式为空）
	HaType        string `json:"haType"`        // HA类型（server/physical）
	PhysicalHaIp  string `json:"physicalHaIp"`  // 物理HA设备IP
	PhysicalHaNic string `json:"physicalHaNic"` // 物理HA设备网卡

	// 通用必传字段
	ImageRepo        string `json:"imageRepo" binding:"required"`        // 镜像仓库（如registry.aliyuncs.com/google_containers）
	NetworkComponent string `json:"networkComponent" binding:"required"` // 网络插件（如cilium）
	ContainerRuntime string `json:"containerRuntime" binding:"required"` // 容器运行时（如docker）
}

// JSONSlice 用于处理[]int64和[]string类型的JSON序列化
type JSONSlice []interface{}

// Value 将切片转换为JSON字符串
func (j JSONSlice) Value() (driver.Value, error) {
	return json.Marshal(j)
}

// Scan 将JSON字符串转换为切片
func (j *JSONSlice) Scan(value interface{}) error {
	bytes, ok := value.([]byte)
	if !ok {
		return errors.New("invalid json value")
	}
	return json.Unmarshal(bytes, j)
}
